package leetcode.editor.cn;

//给你一个整数 n ，返回 和为 n 的完全平方数的最少数量 。
//
// 完全平方数 是一个整数，其值等于另一个整数的平方；换句话说，其值等于一个整数自乘的积。例如，1、4、9 和 16 都是完全平方数，而 3 和 11 不是。
//
//
//
//
// 示例 1：
//
//
//输入：n = 12
//输出：3
//解释：12 = 4 + 4 + 4
//
// 示例 2：
//
//
//输入：n = 13
//输出：2
//解释：13 = 4 + 9
//
//
//
// 提示：
//
//
// 1 <= n <= 10⁴
//
//
// Related Topics 广度优先搜索 数学 动态规划 👍 2001 👎 0

public class PerfectSquares{
	public static void main(String[] args) {
		Solution solution = new PerfectSquares().new Solution();
		int i = solution.numSquares(12);

	}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {

	/**   我理解了
	 * 动态规划
	 * 假设求数字 n的最小平方数的个数，
	 *那个这个组成的数字  必然在1-根号下n之间
	 * 假设列举到 i   f(n)= f(n-i*i)+1(这个1就代表了 i*i)
	 * 同时因为计算完全数的组成数字不是严格增大的（比如 3的完全平方数是3，4的完全平方数是1）
	 * 需要遍历从1到根号下n
	 */



	public int numSq2uares(int n) {
		int[] f = new int[n + 1];
		for (int i = 1; i <= n; i++) {
			int min = Integer.MAX_VALUE;
			double sqrt = Math.sqrt(i);
			for (int j = 0; j<sqrt; j++) {
				min = Math.min(min, f[i - j * j]);
			}
			f[i] = min + 1;
		}
		return f[n];
	}


	public int numSquares(int n) {
		int[] f = new int[n + 1];//这个就是列举从1-n的完全平方数的结果
		for (int i = 1; i <= n; i++) {
			int minn = Integer.MAX_VALUE;
			for (int j = 1; j * j <= i; j++) {
				minn = Math.min(minn, f[i - j * j]);//计算当前遍历结果完全平方数的个数和目前计算出的最小那个小
			}
			f[i] = minn + 1;//这个1就是代表着j*j
		}
		return f[n];
	}
}

//leetcode submit region end(Prohibit modification and deletion)

}
